﻿using System;
using System.Collections.Generic;
using System.Text;
using Dost.Khcn.Data.EntityModel;
using Dost.Khcn.Data.Implements;
using Dost.Khcn.Data.Interfaces;
using Monkey.Framework.Logging;

namespace Dost.Khcn.Biz
{
    public class ChuyenGiaBiz
    {
        #region Properties

        private IChuyenGiaDao _chuyenGiaDao;
        private IChuyenGiaDao ChuyenGiaData
        {
            get { return _chuyenGiaDao ?? (_chuyenGiaDao = new ChuyenGiaDao()); }
        }

        #endregion

        #region Constructors

        #endregion

        #region CRUD Methods

        public ChuyenGia CreateChuyenGia(ChuyenGia chuyenGia)
        {
            // validate inputs
            if (chuyenGia == null || string.IsNullOrEmpty(chuyenGia.HoTen)) return null;

            // ten
            chuyenGia.HoTen = chuyenGia.HoTen.Trim();
            var arrName = chuyenGia.HoTen.Split(' ');
            chuyenGia.Ten = arrName[arrName.Length - 1];

            return ChuyenGiaData.AddChuyenGia(chuyenGia);
        }

        public void UpdateChuyenGia(ChuyenGia chuyenGia)
        {
            if (chuyenGia == null || string.IsNullOrEmpty(chuyenGia.HoTen)) return;

            // ten
            chuyenGia.HoTen = chuyenGia.HoTen.Trim();
            var arrName = chuyenGia.HoTen.Split(' ');
            chuyenGia.Ten = arrName[arrName.Length - 1];

            ChuyenGiaData.UpdateChuyenGia(chuyenGia);
        }

        public object DeleteChuyenGia(int id)
        {
            try
            {
                ChuyenGiaData.DeleteChuyenGia(id);
                return new { Result = "OK" };
            }
            catch (Exception ex)
            {
                return new { Result = "ERROR", ex.Message };
            }
        }

        #endregion

        #region Select Methods

        public ChuyenGia GetById(int id)
        {
            return id > 0 ? ChuyenGiaData.GetById(id) : null;
        }

        public List<ChuyenGia> GetAllChuyenGias()
        {
            return ChuyenGiaData.GetAll();
        }

        public object GetChuyenGias(int startIndex, int pageSize, string sorting, string name)
        {
            try
            {
                int totalRecords;
                var chuyenGias = ChuyenGiaData.GetChuyenGias(startIndex, pageSize, sorting, name, out totalRecords);
                return new { Result = "OK", Records = chuyenGias, TotalRecordCount = totalRecords };
            }
            catch (Exception ex)
            {
                return new { Result = "ERROR", ex.Message };
            }
        }

        /// <summary>
        /// Tra cuu chuyen gia
        /// </summary>
        /// <param name="startIndex">Vi tri</param>
        /// <param name="pageSize">Trang</param>
        /// <param name="sorting">Sap xep</param>
        /// <param name="hoTen">Tra cuu theo ho ten</param>
        /// <param name="tenDonVi">Tra cuu theo don vi</param>
        /// <param name="hocHamId">Tra cuu theo hoc ham</param>
        /// <param name="hocViId">Tra cuu theo hoc vi</param>
        /// <returns></returns>
        public object GetChuyenGiaViews(int startIndex, int pageSize, string sorting, string hoTen, string tenDonVi, int hocHamId, int hocViId)
        {
            // sorting
            if (sorting == "HoTen ASC") sorting = "Ten ASC";
            if (sorting == "HoTen DESC") sorting = "Ten DESC";

            try
            {
                int totalRecords;
                var chuyenGias = ChuyenGiaData.GetChuyenGiaViews(startIndex, pageSize, sorting, hoTen, tenDonVi, hocHamId, hocViId, out totalRecords);
                return new { Result = "OK", Records = chuyenGias, TotalRecordCount = totalRecords };
            }
            catch (Exception ex)
            {
                LoggingFactory.GetLogger().Log(ex.ToString());
                return new { Result = "ERROR", ex.Message };
            }
        }

        public object SearchChuyenGia(int startIndex, int pageSize, string sorting, string tenDonVi, string tenCongTrinh, int linhVucId, int hocHamId, int hocViId, int chuyenNganhId)
        {
            // sorting
            if (sorting == "HoTen ASC") sorting = "Ten ASC";
            if (sorting == "HoTen DESC") sorting = "Ten DESC";

            try
            {
                int totalRecords;
                var chuyenGias = ChuyenGiaData.SearchChuyenGia(startIndex, pageSize, sorting, tenDonVi, tenCongTrinh, linhVucId, hocHamId, hocViId, chuyenNganhId, out totalRecords);
                return new { Result = "OK", Records = chuyenGias, TotalRecordCount = totalRecords };
            }
            catch (Exception ex)
            {
                LoggingFactory.GetLogger().Log(ex.ToString());
                return new { Result = "ERROR", ex.Message };
            }
        }

        public object GetDetailsById(int id)
        {
            return id > 0 ? ChuyenGiaData.GetDetailsById(id) : null;
        }

        public object GetInfoDetailsById(int id)
        {
            return id > 0 ? ChuyenGiaData.GetInfoDetailsById(id) : null;
        }

        #endregion

        #region Export

        public string GenerateHtm(ChuyenGiaDetailView chuyenGia)
        {
            if (chuyenGia == null) return string.Empty;

            var sbHmtl = new StringBuilder();
            // thong tin chung
            sbHmtl.Append("<html><body style='font-size:12px !important;font-family:Times New Roman !important;'><head><meta charset=\"utf-8\" /></head>");
            sbHmtl.Append("<table>");
            sbHmtl.Append("<tr><td colspan='2'><p><strong>Thông tin chung:</strong></p></td></tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Họ, tên chuyên gia: {0}</td>", chuyenGia.HoTen);
            sbHmtl.AppendFormat("<td>Giới tính: {0}</td>", chuyenGia.GioiTinh ? "Nam" : "Nữ");
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Năm sinh: {0}</td>", chuyenGia.NamSinh);
            sbHmtl.AppendFormat("<td>Dân tộc: {0}</td>", chuyenGia.DanToc);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td colspan='2'>Địa chỉ liên hệ: {0}</td>", chuyenGia.DiaChi);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Điện thoại: {0}</td>", chuyenGia.DienThoai);
            sbHmtl.AppendFormat("<td>Email: {0}</td>", chuyenGia.Email);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Học hàm: {0}</td>", chuyenGia.TenHocHam);
            sbHmtl.AppendFormat("<td>Năm được phong học hàm: {0}</td>", chuyenGia.NamHocHam);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td colspan='2'>Học vị: {0}</td>", chuyenGia.TenHocVi);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Chức vụ: {0}</td>", chuyenGia.ChucVu);
            sbHmtl.AppendFormat("<td>Chức danh nghiên cứu: {0}</td>", chuyenGia.ChucDanh);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td colspan='2'>Đơn vị đang công tác (hoặc trước khi nghỉ hưu):</td>");
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Tên: {0}</td>", chuyenGia.TenDonVi);
            sbHmtl.AppendFormat("<td>Điện thoại: {0}</td>", chuyenGia.DienThoaiDonVi);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td colspan='2'>Địa chỉ: {0}</td>", chuyenGia.DiaChiDonVi);
            sbHmtl.Append("</tr>");
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td colspan='2'>Lĩnh vực nghiên cứu chính: {0}</td>", chuyenGia.TenLinhVuc);
            sbHmtl.Append("</tr>");

            sbHmtl.Append("<tr><td colspan='2'><p><strong>Quá trình đào tạo:</strong></p></td></tr>");
            sbHmtl.AppendFormat("<tr><td colspan='2'>Chuyên ngành đào tạo: {0}</td></tr>", chuyenGia.TenChuyenNganh);
            sbHmtl.AppendFormat("<tr><td colspan='2'>Hình thức đào tạo: {0}</td></tr>", chuyenGia.TenHinhThucDaoTao);
            sbHmtl.AppendFormat("<tr><td colspan='2'>Tên cơ sở đào tạo: {0}</td></tr>", chuyenGia.TenCoSoDaoTao);
            sbHmtl.Append("<tr>");
            sbHmtl.AppendFormat("<td>Nước cấp: {0}</td>", chuyenGia.TenQuocGia);
            sbHmtl.AppendFormat("<td>Năm nhận học vị: {0}</td>", chuyenGia.NamHocVi);
            sbHmtl.Append("</tr>");
            sbHmtl.AppendFormat("<tr><td colspan='2'>Tên luận án: {0}</td></tr>", chuyenGia.TenLuanAn);

            sbHmtl.Append("<tr><td colspan='2'><p><strong>Quá trình công tác:</strong></p></td></tr>");
            sbHmtl.Append("<tr><td colspan='2'>");
            sbHmtl.Append("<table cellpadding='0' cellspacing='0' width='97%' style='border-collapse:collapse;'>");
            sbHmtl.Append("<tr style='text-align: center;'><td style='border:1px solid;'>Thời gian:</td><td style='border:1px solid;'>Tên tổ chức:</td><td style='border:1px solid;'>Địa chỉ:</td></tr>");
            if (chuyenGia.QuaTrinhCongTacList != null)
            {
                foreach (var quaTrinhCongTac in chuyenGia.QuaTrinhCongTacList)
                {
                    sbHmtl.AppendFormat("<tr><td style='border:1px solid;'>{0}</td><td style='border:1px solid;'>{1}</td><td style='border:1px solid;'>{2}</td></tr>",
                        quaTrinhCongTac.ThoiGian, quaTrinhCongTac.TenToChuc, quaTrinhCongTac.DiaChi);
                }
            }
            sbHmtl.Append("</table>");
            sbHmtl.Append("</td></tr>");

            sbHmtl.AppendFormat("<tr><td colspan='2'>Trình độ ngoại ngữ: {0}</td></tr>", chuyenGia.NgoaiNgu);

            sbHmtl.Append("<tr><td colspan='2'><strong>Hoạt động chuyên ngành:</strong></td></tr>");
            sbHmtl.Append("<tr><td colspan='2'><p>Tên công trình nghiên cứu đã công bố:</p></td></tr>");
            sbHmtl.Append("<tr><td colspan='2'>");
            sbHmtl.Append("<table cellpadding='0' cellspacing='0' width='97%' style='border-collapse:collapse;'>");
            sbHmtl.Append("<tr style='text-align: center;'><td style='border:1px solid;'>Tên công trình</td><td style='border:1px solid;'>Nơi công bố<br />(tên tạp chí đã đăng công trình)</td><td style='border:1px solid;'>Năm công bố</td><td style='border:1px solid;'>Tác giả hoặc đồng tác giả</td></tr>");
            if (chuyenGia.CongTrinhNghienCuuList != null)
            {
                foreach (var congTrinh in chuyenGia.CongTrinhNghienCuuList)
                {
                    sbHmtl.AppendFormat("<tr><td style='border:1px solid;'>{0}</td><td style='border:1px solid;'>{1}</td><td style='border:1px solid;'>{2}</td><td style='border:1px solid;'>{3}</td></tr>",
                        congTrinh.TenCongTrinh, congTrinh.NoiCongBo, congTrinh.NamCongBo, congTrinh.TacGia);
                }
            }
            sbHmtl.Append("</table>");
            sbHmtl.Append("</td></tr>");

            sbHmtl.Append("<tr><td colspan='2' style='margin-top:10px;'>Dự án/đề tài cấp nhà nước/cấp Bộ đã thực hiện:</td></tr>");
            sbHmtl.Append("<tr><td colspan='2'>");
            sbHmtl.Append("<table cellpadding='0' cellspacing='0' width='97%' style='border-collapse:collapse;'>");
            sbHmtl.Append("<tr style='text-align: center;'><td style='border:1px solid;'>Tên dự án/đề tài</td><td style='border:1px solid;'>Chuyên ngành/lĩnh vực</td><td style='border:1px solid;'>Năm thực hiện</td><td style='border:1px solid;'>Tác giả hoặc đồng tác giả</td></tr>");
            if (chuyenGia.DeTaiCapNhaNuocList != null)
            {
                foreach (var deTai in chuyenGia.DeTaiCapNhaNuocList)
                {
                    sbHmtl.AppendFormat("<tr><td style='border:1px solid;'>{0}</td><td style='border:1px solid;'>{1}</td><td style='border:1px solid;'>{2}</td><td style='border:1px solid;'>{3}</td></tr>",
                        deTai.TenDeTai, deTai.TenChuyenNganh, deTai.NamThucHien, deTai.TacGia);
                }
            }
            sbHmtl.Append("</table>");
            sbHmtl.Append("</td></tr>");

            sbHmtl.Append("<tr><td colspan='2' style='margin-top:10px;'>Dự án/đề tài cấp tỉnh đã thực hiện:</td></tr>");
            sbHmtl.Append("<tr><td colspan='2'>");
            sbHmtl.Append("<table cellpadding='0' cellspacing='0' width='97%' style='border-collapse:collapse;'>");
            sbHmtl.Append("<tr style='text-align: center;'><td style='border:1px solid;'>Tên dự án/đề tài</td><td style='border:1px solid;'>Tỉnh/thành phố</td><td style='border:1px solid;'>Năm thực hiện</td><td style='border:1px solid;'>Tác giả hoặc đồng tác giả</td></tr>");
            if (chuyenGia.DeTaiCapTinhList != null)
            {
                foreach (var deTai in chuyenGia.DeTaiCapTinhList)
                {
                    sbHmtl.AppendFormat("<tr><td style='border:1px solid;'>{0}</td><td style='border:1px solid;'>{1}</td><td style='border:1px solid;'>{2}</td><td style='border:1px solid;'>{3}</td></tr>",
                        deTai.TenDeTai, deTai.TenTinhThanhPho, deTai.NamThucHien, deTai.TacGia);
                }
            }
            sbHmtl.Append("</table>");
            sbHmtl.Append("</td></tr>");

            sbHmtl.Append("<tr><td colspan='2' style='margin-top:10px;'>Giải thưởng về KH&CN (từ trước đến nay):</td></tr>");
            sbHmtl.Append("<tr><td colspan='2'>");
            sbHmtl.Append("<table cellpadding='0' cellspacing='0' width='97%' style='border-collapse:collapse;'>");
            sbHmtl.Append("<tr style='text-align: center;'><td style='border:1px solid;'>Hình thức và nội dung giải thưởng</td><td style='border:1px solid;'>Năm tặng thưởng</td></tr>");
            if (chuyenGia.GiaiThuongKhcnList != null)
            {
                foreach (var giaiThuong in chuyenGia.GiaiThuongKhcnList)
                {
                    sbHmtl.AppendFormat("<tr><td style='border:1px solid;'>{0}</td><td style='border:1px solid;'>{1}</td></tr>",
                        giaiThuong.NoiDung, giaiThuong.NamTangThuong);
                }
            }
            sbHmtl.Append("</table>");
            sbHmtl.Append("</td></tr>");

            sbHmtl.Append("<tr><td colspan='2'>Thành tựu hoạt động KH&CN khác:</td></tr>");
            sbHmtl.AppendFormat("<tr><td colspan='2'>{0}</td></tr>", chuyenGia.ThanhTuuKhcnKhac);

            sbHmtl.Append("</table>");
            sbHmtl.Append("</body></html>");

            return sbHmtl.ToString();
        }

        #endregion

        #region Reports

        public object ReportLinhVuc()
        {
            try
            {
                var reports = ChuyenGiaData.ReportLinhVuc();
                return new { Result = "OK", Records = reports };
            }
            catch (Exception ex)
            {
                return new { Result = "ERROR", ex.Message };
            }
        }

        #endregion
    }
}
